package com.toonan.core.mongo;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import com.google.common.collect.Lists;
import com.mongodb.client.result.UpdateResult;
import com.toonan.core.matatype.Dto;
import com.toonan.core.util.WebplusMongo;
import com.toonan.core.util.WebplusUtil;
import com.toonan.core.vo.PageResult;

/**
 * 
 * @ClassName:  BaseMongo   
 * @Description:MongoDB基础操作
 * @author: 陈骑元（chenqiyuan@toonan.com)
 * @date:   2022年2月17日 下午11:00:22     
 * @Copyright: 2022 www.toonan.com Inc. All rights reserved. 
 * 注意：本内容仅限于广州市图南软件有限公司内部传阅，禁止外泄以及用于其他的商业目
 */
public abstract class BaseMongo<T> {
  
	protected abstract Class<T> getEntityClass();
	
	 @Autowired
	 public  MongoTemplate mongoTemplate;
	 /**
	  * 
	  * 简要说明：存在就更新，不存在就插入
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:03:41 
	  * @param 说明
	  * @return 说明
	  */
	 public T save(T t) {
		 
		 return this.mongoTemplate.save(t);
	 }
	 
	 
	 /**
	  * 
	  * 简要说明：插入一条
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:03:41 
	  * @param 说明
	  * @return 说明
	  */
	 public T insert(T t) {
		 
		 return this.mongoTemplate.insert(t);
	 }
	 
	 /**
	  * 
	  * 简要说明：根据id更新
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:03:41 
	  * @param 说明
	  * @return 说明
	  */
	 public boolean  updateById(T t) {
		 Object idValue=WebplusMongo.getIdFieldValue(t);
		 Query query=WebplusMongo.setQueryById(idValue);
		 Update update=WebplusMongo.getUpdateByObject(t);
		 UpdateResult updateResult=this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
		
		 return updateResult.getModifiedCount()>0;
	 }
	 
	 /**
	  * 
	  * 简要说明：根据id更新
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:03:41 
	  * @param 说明
	  * @return 说明
	  */
	 public boolean  updateById(Object id,Dto updateDto) {
		 Query query=WebplusMongo.setQueryById(id);
		 Update update=WebplusMongo.getUpdateByDto(updateDto);
		 return this.mongoTemplate.updateFirst(query, update, this.getEntityClass()).getModifiedCount()>0;
	 }
	 /**
	  * 
	  * 简要说明：批量更新
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年3月3日 下午11:21:29 
	  * @param 说明
	  * @return 说明
	  */
     public boolean  updateBatchById(List<T>  updateList) {
    	 long updateCount=0;
    	 for(T t:updateList) {
    		 Object idValue=WebplusMongo.getIdFieldValue(t);
    		 Query query=WebplusMongo.setQueryById(idValue);
    		 Update update=WebplusMongo.getUpdateByObject(t);
    		 UpdateResult updateResult=this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
    		 updateCount+=updateResult.getModifiedCount();
    	 }
    	 return updateCount>0;
     }
	 
	/**
	 * 
	 * 简要说明：通过id查询记录
	 * 编写者：陈骑元（chenqiyuan@toonan.com）
	 * 创建时间： 2022年2月17日 下午11:10:55 
	 * @param 说明
	 * @return 说明
	 */
	 public T findById(Object id) {
		 
		
		 return this.mongoTemplate.findById(id, this.getEntityClass());
	 }
	 
	 
	 
	 /**
	  * 
	  * 简要说明：
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:35:43 
	  * @param 说明
	  * @return 说明
	  */
	 public T findOne(Query query) {
		 
		 return this.mongoTemplate.findOne(query, this.getEntityClass());
				  
	 }
	 /**
	  * 
	  * 简要说明：根据条件查询多条记录
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:37:12 
	  * @param 说明
	  * @return 说明
	  */
     public List<T> findList(Query query){
		 
    	 
    	 return this.mongoTemplate.find(query, getEntityClass());
	 }
     /**
      * 
      * 简要说明：分页查询
      * 编写者：陈骑元（chenqiyuan@toonan.com）
      * 创建时间： 2022年2月18日 下午9:03:54 
      * @param 说明
      * @return 说明
      */
     public PageResult findPage(Query query,PageResult pageResult) {
    	 long count=this.count(query);
    	 pageResult.setCount(count);
    	 WebplusMongo.withPage(query,pageResult);
    	 List<T> dataList=this.findList(query);
    	 pageResult.setDataList(dataList);
    	 return pageResult;
      }
     /**
      * 
      * 简要说明：查询所有
      * 编写者：陈骑元（chenqiyuan@toonan.com）
      * 创建时间： 2022年2月18日 下午9:01:33 
      * @param 说明
      * @return 说明
      */
     public List<T> findAll(){
    	 
    	 return this.mongoTemplate.findAll(this.getEntityClass());
     }
     /**
      * 
      * 简要说明：查询多条记录
      * 编写者：陈骑元（chenqiyuan@toonan.com）
      * 创建时间： 2022年2月17日 下午11:38:33 
      * @param 说明
      * @return 说明
      */
     public long count(Query query) {
    	 
    	 return this.mongoTemplate.count(query, getEntityClass());
     }
	 /**
	  * 
	  * 简要说明：通过id批量查询
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:19:16 
	  * @param 说明
	  * @return 说明
	  */
	 public List<T> findBatchIds(Collection<? extends Serializable> idList) {
		 
		 if(WebplusUtil.isEmpty(idList)) {
			 
			 return Lists.newArrayList();
		 }
	     Query query=WebplusMongo.setQueryByBatchId(idList);
	     
	     return this.mongoTemplate.find(query, this.getEntityClass());
		 
	 }
	 
	 /**
	  * 
	  * 简要说明：通过id查询一条记录 成功返回true，失败返回false
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:13:46 
	  * @param 说明
	  * @return 说明
	  */
	 public boolean  removeById(Object id) {
		 Query query=WebplusMongo.setQueryById(id);
		 return this.mongoTemplate.remove(query, this.getEntityClass()).getDeletedCount()>0;
		 
	 }
	 
	 /**
	  * 
	  * 简要说明：批量删除
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:30:43 
	  * @param 说明
	  * @return 说明
	  */
	 public boolean removeBatchIds(Collection<? extends Serializable> idList) {
		 if(WebplusUtil.isEmpty(idList)) {
			 
			 return false;
		 }
		 Query query=WebplusMongo.setQueryByBatchId(idList);
		 return this.remove(query);
	 }
	 
	 /**
	  * 
	  * 简要说明：根据条件进行删除
	  * 编写者：陈骑元（chenqiyuan@toonan.com）
	  * 创建时间： 2022年2月17日 下午11:33:31 
	  * @param 说明
	  * @return 说明
	  */
	 public boolean remove(Query query) {
		 
		 return this.mongoTemplate.remove(query, this.getEntityClass()).getDeletedCount()>0	;
	 }
	 
	 
	
	 
	
}
